package com.gzhryc.shared_device.bxscn.code.services;

import java.sql.SQLException;
import java.util.Date;
import java.util.List;

import com.gzhryc.common.StringTools;
import com.gzhryc.common.exceptions.LogicException;
import com.gzhryc.common.logging.Logger;
import com.gzhryc.jdbc.Conditions;
import com.gzhryc.jdbc.JdbcSession;
import com.gzhryc.jdbc.MultiDBTools;
import com.gzhryc.shared_device.bxscn.code.dao.BXSCNShopFeeTemplateDao;
import com.gzhryc.shared_device.bxscn.code.dao.BXSCNShopFeeTemplateItemDao;
import com.gzhryc.shared_device.bxscn.code.dao.db.BXSCNShopFeeTemplate;
import com.gzhryc.shared_device.bxscn.code.dao.db.BXSCNShopFeeTemplateItem;
import com.gzhryc.shared_device.bxscn.code.dao.enums.BXSCNShopFeeTemplateItemEnum;
import com.gzhryc.shared_device.bxscn.code.dao.models.BXSCNShopFeeTemplateItemCount;
import com.gzhryc.shared_device.bxscn.code.services.dto.BXSCNShopFeeTemplateSearch;

public class BXSCNShopFeeTemplateService {

	static Logger log = Logger.getLogger(BXSCNShopFeeTemplateService.class);

    public static BXSCNShopFeeTemplateService self() {
        return MultiDBTools.getService(BXSCNShopFeeTemplateService.class, true);
    }

    public static BXSCNShopFeeTemplateService self(String jdbcKey) {
        return MultiDBTools.getService(jdbcKey, BXSCNShopFeeTemplateService.class, true);
    }

    BXSCNShopFeeTemplateDao dao;
    BXSCNShopFeeTemplateItemDao itemDao;

    public BXSCNShopFeeTemplateService(String jdbcKey) {
        dao = new BXSCNShopFeeTemplateDao(jdbcKey);
        itemDao = new BXSCNShopFeeTemplateItemDao(jdbcKey);
    }

    public List<BXSCNShopFeeTemplate> findJoinBySearch(BXSCNShopFeeTemplateSearch search, Integer pageNo, Integer pageLimit){
        Conditions conditions = dao.buildConditions(search);
        try {
            return dao.findJoinByCondition(conditions,pageNo,pageLimit);
        } catch (SQLException e) {
            log.error(e.getMessage(),e);
        }
        return null;
    }

    public Long countJoinBySearch(BXSCNShopFeeTemplateSearch search){
        Conditions conditions = dao.buildConditions(search);
        try {
            return dao.countJoin(conditions);
        } catch (SQLException e) {
            log.error(e.getMessage(),e);
        }
        return 0L;
    }
    
    public List<BXSCNShopFeeTemplate> findByUserId(Long userId) {
        if (userId != null) {
            Conditions conditions = new Conditions(BXSCNShopFeeTemplate.class);
            conditions.and().is("userId", userId);

            try {
                return dao.findByCondition(conditions);
            } catch (SQLException e) {
                log.error(e.getMessage(), e);
            }
        }
        return null;
    }
    
    public List<BXSCNShopFeeTemplateItemCount> findByTemplateIds(List<Long> templateIds){
    	if(templateIds != null && templateIds.size() > 0) {
    		Conditions condition = new Conditions(BXSCNShopFeeTemplateItem.class);
    		condition.and().in("templateId", templateIds);
    		try {
				return itemDao.groupTemplateIdCount(condition);
			} catch (SQLException e) {
				log.error(e.getMessage(), e);
			}
    	}
    	return null;
    }

    public BXSCNShopFeeTemplate getById(Long id) {
        if(id != null) {
            try {
                return dao.getById(id);
            } catch (SQLException e) {
                log.error(e.getMessage(), e);
            }
        }
        return null;
    }
    
    public BXSCNShopFeeTemplateItem getItemByAvailable(Long templateId,String batteryTypeId,Integer type) {
    	if(templateId != null && StringTools.isNotBlank(batteryTypeId) && type != null) {
    		BXSCNShopFeeTemplateItem feeTemplateItem = BXSCNShopFeeTemplateService.self().getItemByKeys(templateId,batteryTypeId,type);
    		if(feeTemplateItem == null) {
    			List<BXSCNShopFeeTemplateItem> feeTemplateItemList = BXSCNShopFeeTemplateService.self().findItemByKeys(templateId,batteryTypeId);
    			if(feeTemplateItemList != null && feeTemplateItemList.size() > 0) {
    				for(BXSCNShopFeeTemplateItem item : feeTemplateItemList) {
        				if(BXSCNShopFeeTemplateItemEnum.Type.Normal.index().equals(item.getType())) {
        					feeTemplateItem = item;
        					break;
        				}
        			}
    			}
    		}
    		return feeTemplateItem;
    	}
    	return null;
    }
    
    
    public BXSCNShopFeeTemplateItem getItemByKeys(Long templateId,String batteryTypeId,Integer type) {
    	if(templateId != null && StringTools.isNotBlank(batteryTypeId) && type != null) {
    		Conditions condition = new Conditions(BXSCNShopFeeTemplateItem.class);
      		condition.and().is("templateId", templateId);
      		condition.and().is("batteryTypeId", batteryTypeId);
      		condition.and().is("type", type);
      		
      		try {
      			return itemDao.get(condition);
	        } catch (SQLException e) {
	        	log.error(e.getMessage(), e);
	        }
    	}
    	return null;
    }
    
    public boolean add(BXSCNShopFeeTemplate feeTemplate) throws LogicException{
    	feeTemplate.setCreateDate(new Date());
    	try {
			return dao.insert(feeTemplate) > 0;
		} catch (SQLException e) {
			 log.error(e.getMessage(), e);
		}
    	return false;
    }
    
    public boolean updateNotNull(BXSCNShopFeeTemplate feeTemplate) throws LogicException{
    	try {
			return dao.updateNotNull(feeTemplate) > 0;
		} catch (SQLException e) {
			 log.error(e.getMessage(), e);
		}
    	return false;
    }
    
    public List<BXSCNShopFeeTemplateItem> findItemByTemplateId(Long templateId) {
        if(templateId != null) {
        	Conditions condition = new Conditions(BXSCNShopFeeTemplateItem.class);
        	condition.and().is("templateId", templateId);
            try {
                return itemDao.findByCondition(condition);
            } catch (SQLException e) {
                log.error(e.getMessage(), e);
            }
        }
        return null;
    }
    
    public List<BXSCNShopFeeTemplateItem> findItemByKeys(Long templateId,String batteryTypeId) {
        if(templateId != null && StringTools.isNotBlank(batteryTypeId)) {
        	Conditions condition = new Conditions(BXSCNShopFeeTemplateItem.class);
        	condition.and().is("templateId", templateId);
        	condition.and().is("batteryTypeId", batteryTypeId);
        	
            try {
                return itemDao.findByCondition(condition);
            } catch (SQLException e) {
                log.error(e.getMessage(), e);
            }
        }
        return null;
    }
    
    public List<BXSCNShopFeeTemplateItem> findJoinItemByTemplateId(Long templateId) {
        if(templateId != null) {
        	Conditions condition = new Conditions(BXSCNShopFeeTemplateItem.class);
        	condition.and().is("templateId", templateId);
            try {
                return itemDao.findJoinByCondition(condition);
            } catch (SQLException e) {
                log.error(e.getMessage(), e);
            }
        }
        return null;
    }
    
    public boolean addItem(BXSCNShopFeeTemplateItem feeTemplateItem) {
    	feeTemplateItem.setCreateDate(new Date());
    	try {
			return itemDao.insert(feeTemplateItem) > 0;
		} catch (SQLException e) {
			 log.error(e.getMessage(), e);
		}
    	return false;
    }
    
    public boolean addItem(List<BXSCNShopFeeTemplateItem> feeTemplateItems) {
    	if(feeTemplateItems != null && feeTemplateItems.size() > 0) {
	    	try {
				return itemDao.insert(feeTemplateItems) == feeTemplateItems.size();
			} catch (SQLException e) {
				 log.error(e.getMessage(), e);
			}
    	}
    	return false;
    }
    
    public boolean saveItem(List<BXSCNShopFeeTemplateItem> addItems,List<BXSCNShopFeeTemplateItem> updateItems
    		,List<BXSCNShopFeeTemplateItem> delItems) {
    	JdbcSession.begin();
    	try {
    		boolean flag = false;
    		if(addItems != null && addItems.size() > 0) {
    			flag = addItem(addItems);
    			if(!flag) {
    				return false;
    			}
    		}
    		if(updateItems != null && updateItems.size() > 0) {
    			for(BXSCNShopFeeTemplateItem item : updateItems) {
    				if(item.getTemplateId() != null && StringTools.isNotBlank(item.getBatteryTypeId()) && item.getType() != null) {
    		        	Conditions condition = new Conditions(BXSCNShopFeeTemplateItem.class);
    		        	condition.and().is("templateId", item.getTemplateId());
    		        	condition.and().is("batteryTypeId", item.getBatteryTypeId());
    		        	condition.and().is("type", item.getType());
    		        	
    		        	if(itemDao.updateNotNull(item, condition) < 0) {
    		        		flag = false;
    		        		break;
    		        	}else {
    		        		flag = true;
    		        	}
    				}
    			}
    		}
    		
    		if(flag) {
    			if(delItems != null && delItems.size() > 0) {
    				for(BXSCNShopFeeTemplateItem item : delItems) {
    					Conditions condition = new Conditions(BXSCNShopFeeTemplateItem.class);
    		        	condition.and().is("templateId", item.getTemplateId());
    		        	condition.and().is("batteryTypeId", item.getBatteryTypeId());
    		        	condition.and().is("type", item.getType());
    		        	
    		        	if(itemDao.deleteByCondition(condition) < 0) {
    		        		flag = false;
    		        		break;
    		        	}else {
    		        		flag = true;
    		        	}
    				}
    			}
    		}
    		
    		if(flag) {
    			JdbcSession.commit();
    			return true;
    		}
    	} catch (SQLException e) {
			 log.error(e.getMessage(), e);
		}finally {
			JdbcSession.end();
		}
    	return false;
    }
    
    public boolean deleteItemByKeys(Long templateId,String batteryTypeId) throws LogicException{
    	if(templateId != null) {
        	Conditions condition = new Conditions(BXSCNShopFeeTemplateItem.class);
        	condition.and().is("templateId", templateId);
        	condition.and().is("batteryTypeId", batteryTypeId);
            try {
                return itemDao.deleteByCondition(condition) > 0;
            } catch (SQLException e) {
                log.error(e.getMessage(), e);
            }
        }
    	return false;
    }
    
    public boolean deleteItemByTemplateId(Long templateId) {
    	if(templateId != null) {
        	Conditions condition = new Conditions(BXSCNShopFeeTemplateItem.class);
        	condition.and().is("templateId", templateId);
            try {
                return itemDao.deleteByCondition(condition) >= 0;
            } catch (SQLException e) {
                log.error(e.getMessage(), e);
            }
        }
    	return false;
    }
    
    public boolean deleteById(Long id) throws LogicException{
    	if(id != null) {
    		JdbcSession.begin();
    		try {
				if(dao.deleteById(id) > 0) {
					if(deleteItemByTemplateId(id)) {
						JdbcSession.commit();
						return true;
					}
				}
			} catch (SQLException e) {
				log.error(e.getMessage(), e);
			}  finally {
                JdbcSession.end();
            }
    	}
    	return false;
    }
}
